package view;

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.IOException;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Observer;




import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;




import model.Helipuerto;
import model.Juego;
import model.Mapa;
import model.Nave;
import model.PistaCorta;
import model.PistaLarga;


import fiuba.algo3.titiritero.dibujables.SuperficiePanel;
import fiuba.algo3.titiritero.modelo.GameLoop;
import fiuba.algo3.titiritero.modelo.ObjetoDibujable;
import fiuba.algo3.titiritero.modelo.ObjetoVivo;
import fiuba.algo3.titiritero.modelo.ObservadorDeGameLoop;
import fiuba.algo3.titiritero.modelo.SuperficieDeDibujo;

public class VentanaPrincipal implements ObservadorDeGameLoop{

	private JFrame frame;
	private GameLoop gameLoop;
	private LinkedList<ObservadorMouse> observadoresMouse= new LinkedList<ObservadorMouse>();	
	private LinkedList<Observer> observadoresNave= new LinkedList<Observer>();


	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					VentanaPrincipal window = new VentanaPrincipal();
					window.frame.setVisible(true);
					
					VentanaReferencias unaVentana = new VentanaReferencias();
					unaVentana.getFrame().setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the application.
	 */
	public VentanaPrincipal() {
		try {
			initialize();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * Initialize the contents of the frame.
	 * @throws IOException 
	 */
	private void initialize() throws IOException {
		frame = new JFrame();
		frame.setForeground(new Color(0, 0, 0));
		frame.setBounds(100, 100, 600, 600);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.getContentPane().setLayout(null);
		frame.setTitle("JUEGO COPCONTROL");
		
		JButton btnIniciar = this.addBotonIniciar();
		JButton btnDetener = this.addBotonDetener();
		//JButton btnAgregar = this.addBotonAgregarAvion();
		
		JPanel panel = this.addSuperficiePanel();
		
		//this.controlador = ControladorGameLoop.getControladorGameLoop(panel);
		this.gameLoop = new GameLoop((SuperficieDeDibujo) panel);
		
		
		this.gameLoop.agregarObservador(this);
		
		
		this.inicializarModelo();
		
		this.addMouseListener(panel);
		
		
		this.addKeyListener();

		this.setComponentsFocus(btnIniciar, btnDetener);
		//this.setComponentsFocus(btnIniciar, btnDetener, btnAgregar);

	}

	private void inicializarModelo() throws IOException {


		Juego miJuego = new Juego();
		this.gameLoop.agregar(miJuego);
		this.agregarObservador((ObservadorMouse) miJuego);
			
		
		PistaCorta modeloPistaCorta = new PistaCorta();
		VistaPistaCorta vistaPC = new VistaPistaCorta(modeloPistaCorta);
		PistaLarga modeloPistaLarga = new PistaLarga();
		VistaPistaLarga vistaPL = new VistaPistaLarga(modeloPistaLarga);
		Helipuerto modeloH = new Helipuerto();
		VistaHelipuerto vistaH = new VistaHelipuerto(modeloH);
		
		this.gameLoop.agregar(vistaPC);
		this.gameLoop.agregar(vistaH);
		this.gameLoop.agregar(vistaPL);
			
	}

	
	private void setComponentsFocus(JButton btnIniciar, JButton btnDetener) {
		frame.setFocusable(true);
		btnDetener.setFocusable(false);
		btnIniciar.setFocusable(false);
		//btnAgregar.setFocusable(false);
	}

	private void addKeyListener() {
		frame.addKeyListener(new KeyListener(
				) {
			
			@Override
			public void keyTyped(KeyEvent arg0) {
				System.out.println("Key pressed");
			}
			
			@Override
			public void keyReleased(KeyEvent arg0) {
			}
			
			@Override
			public void keyPressed(KeyEvent arg0) {
				System.out.println("Ping");
			}  
			 	
		});
	}

	private void addMouseListener(JPanel panel) {
		panel.addMouseListener(new MouseAdapter() {			
			@Override
			public void mouseClicked(MouseEvent arg0) {
				notificarEvento(arg0.getX(),arg0.getY());
				}});
	}

	private JPanel addSuperficiePanel() {
		JPanel panel = new SuperficiePanel();
		panel.setBackground(new Color(0,0,0));
		panel.setBounds(42, 53, Mapa.getAnchoMapa(), Mapa.getAltoMapa());
		frame.getContentPane().add(panel);
		return panel;
	}

	private JButton addBotonDetener() {
		JButton btnDetener = new JButton("Detener");
		btnDetener.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				//controlador.getGameLoop().detenerEjecucion();
				gameLoop.detenerEjecucion();
			}
		});
		btnDetener.setBounds(425, 16, 92, 25);
		frame.getContentPane().add(btnDetener);
		return btnDetener;
	}

	private JButton addBotonIniciar() {
		JButton btnIniciar = new JButton("Iniciar");
		btnIniciar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				//controlador.getGameLoop().iniciarEjecucion();
				gameLoop.iniciarEjecucion();
			}
		});
		btnIniciar.setBounds(42, 16, 77, 25);
		frame.getContentPane().add(btnIniciar);
		return btnIniciar;
	}

	@Override
	public void notificarCicloFinalizado() {
		Mapa miMapa = Mapa.getMapa();
		
		Iterator<Nave> itNave = miMapa.getNaves().iterator();
		while(itNave.hasNext()){
			Nave unaNave = itNave.next();
			if( unaNave.estaVolando()){
				this.gameLoop.agregar((ObjetoVivo)unaNave);	
				this.gameLoop.agregar((ObjetoDibujable)unaNave.getVista());
				this.observadoresNave.addLast(unaNave.getVista());
			} else {
				this.gameLoop.remover((ObjetoDibujable) unaNave.getVista());
				this.gameLoop.remover((ObjetoVivo)unaNave);
				this.observadoresNave.remove(unaNave.getVista());
			}
		}
		
	}
	private void agregarObservador(ObservadorMouse observador){
		this.observadoresMouse.add(observador);	
	}
	
	public void notificarEvento(int x, int y){
		for(ObservadorMouse observador : observadoresMouse)
		observador.notificarEvento(x, y);
	}
	/*
	private JButton addBotonAgregarAvion() {
		
		JButton btnIniciar = new JButton("Agregar avion");
		btnIniciar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				AvionLiviano modelo = new AvionLiviano();					
				VistaAvionLiviano vista = new VistaAvionLiviano(modelo);
				gameLoop.agregar(modelo);
				gameLoop.agregar(vista);
				
			}
		});
		btnIniciar.setBounds(200, 16, 150, 25);
		frame.getContentPane().add(btnIniciar);
		return btnIniciar;
		
		
	}
	*/
}
